package com.java.Collection.List.ArrayList;

import java.util.ArrayList;
import java.util.Arrays;

public class ArrayListAPI {
    static class Inner {
        private String name;
        
        public Inner(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return name;
        }
    }
    
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        Inner inner = new Inner("_");
        
        // add：添加一个对象到集合，返回值表示原集合是否改变
        System.out.println(arrayList.add(inner)); // true
        System.out.println(arrayList.add("B")); // true
        System.out.println(arrayList.add("B")); // true
        System.out.println(arrayList.add("A")); // true
        System.out.println(arrayList); // [_, B, B, A]
        
        // add(index)⭐：添加一个对象到集合指定位置，无返回值
        arrayList.add(3, "C");
        System.out.println(arrayList); // [_, B, B, C, A]
        
        // addAll：添加多个对象到集合，返回值表示原集合是否改变
        System.out.println(arrayList.addAll(Arrays.asList("B", "B", "D"))); // true
        System.out.println(arrayList); // [_, B, B, C, A, B, B, D]
        
        // set(index)⭐：设置一个对象到集合指定位置，返回值表示指定位置原对象
        System.out.println(arrayList.set(1, "E")); // B
        System.out.println(arrayList); // [_, E, B, C, A, B, B, D]
        
        // get(index)⭐：获取集合指定位置的对象，返回值表示指定位置对象
        System.out.println(arrayList.get(1)); // E
        
        // remove：移除集合内一个指定对象，若指定对象重复则移除第一个，返回值表示原集合是否改变
        System.out.println(arrayList.remove(new Inner("_"))); // false
        System.out.println(arrayList.remove(inner)); // true
        System.out.println(arrayList.remove("B")); // true
        System.out.println(arrayList); // [E, C, A, B, B, D]
        
        // remove(index)⭐：移除集合内一个指定位置的对象，返回值表示指定位置原对象。注意集合内元素为整数时参数表示索引而非元素
        System.out.println(arrayList.remove(0)); // E
        System.out.println(arrayList); // [C, A, B, B, D]
        
        // removeAll：移除集合内多个指定对象，返回值表示原集合是否改变
        System.out.println(arrayList.removeAll(Arrays.asList("B", "E"))); // true
        System.out.println(arrayList); // [C, A, D]
        
        // contains：判断集合内是否存在指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(arrayList.contains("A")); // true
        
        // containsAll：判断集合内是否存在所有指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(arrayList.containsAll(Arrays.asList("A", "C"))); // true
        System.out.println(arrayList.containsAll(Arrays.asList("A", "C", "G"))); // false
        
        // retainAll：获取两集合的交集对象，返回值表示原集合是否改变
        System.out.println(new ArrayList<>(Arrays.asList("A", "C")).retainAll(Arrays.asList("B"))); // true
        System.out.println(arrayList.retainAll(Arrays.asList("C", "A", "B"))); // true
        System.out.println(arrayList); // [C, A]
        
        // isEmpty：判断集合内对象个数是否为空
        System.out.println(new ArrayList<>().isEmpty()); // true
        System.out.println(arrayList.isEmpty()); // false
        
        // size：获取集合内对象总数
        System.out.println(new ArrayList<>().size()); // 0
        System.out.println(arrayList.size()); // 2
        
        // toArray：获取集合的数组形式
        System.out.println(arrayList.toArray()); // [Ljava.lang.Object;@1b6d3586
        
        // clear：清空集合内所有对象，无返回值
        arrayList.clear();
        System.out.println(arrayList); // []
    }
}
